#ifndef HR_HPP
#define HR_HPP

#include "ap_int.h"
#include "ap_fixed.h"
#include "hls_stream.h"
#include "fpal.hpp" // 包含定点数运算逻辑库

// -----------------------------------------------------------
// 输入结构体：从PS/DDR接收的定点数三角形光栅化参数
// PS侧负责将浮点数转换为这些定点数格式
// -----------------------------------------------------------
struct raster_params_packet_fixed {
    // 屏幕空间定点数顶点坐标 (2D)
    fpal::fp_coord_t v0_x, v0_y;
    fpal::fp_coord_t v1_x, v1_y;
    fpal::fp_coord_t v2_x, v2_y;

    // 屏幕空间原始深度值 (1/Z)，用于深度插值
    // 已知PS已经将1/Z映射到 fpal::fp_z_buffer_t 的 U.16.0 范围
    fpal::fp_z_buffer_t v0_z, v1_z, v2_z; 

    // 三角形边缘方程系数 (A, B, C)
    // Ax + By + C = 0，其中 A, B, C 均为 fpal::fp_coord_t
    // C0 对应 v0v1 边，C1 对应 v1v2 边，C2 对应 v2v0 边
    fpal::fp_coord_t edge0_A, edge0_B, edge0_C;
    fpal::fp_coord_t edge1_A, edge1_B, edge1_C;
    fpal::fp_coord_t edge2_A, edge2_B, edge2_C;

    // 深度梯度 (dzdx, dzdy)
    // dzdx 和 dzdy 均为 fpal::fp_coord_t
    // 这里采用基准点v0的深度作为插值基准
    fpal::fp_coord_t dzdx;
    fpal::fp_coord_t dzdy;

    // 纯色 (RGB)
    fpal::fp_color_channel_t pure_color_R;
    fpal::fp_color_channel_t pure_color_G;
    fpal::fp_color_channel_t pure_color_B;
};

// -----------------------------------------------------------
// 输出结构体：HR生成的定点数像素片段
// -----------------------------------------------------------
struct pixel_fragment_packet_fixed {
    fpal::fp_screen_pixel_idx_t screen_x;       // 屏幕X坐标
    fpal::fp_screen_pixel_idx_t screen_y;       // 屏幕Y坐标
    fpal::fp_z_buffer_t interpolated_z;         // 插值后的深度值
    fpal::fp_color_channel_t pure_color_R; // 纯色R
    fpal::fp_color_channel_t pure_color_G; // 纯色G
    fpal::fp_color_channel_t pure_color_B; // 纯色B
    bool is_valid_pixel;                        // 是否为有效像素
};


// -----------------------------------------------------------
// HR模块的主HLS函数声明
// -----------------------------------------------------------
// input_raster_params_stream: 从PBIRSM/RPC接收的三角形参数流
// output_pixel_fragment_stream: 输出到PDTDW的像素片段流
// max_x, max_y: 屏幕分辨率的边界，用于光栅化循环
// num_triangles: 本帧需要处理的三角形数量
// total_fragments_generated: 输出参数，HR实际生成的所有像素片段总数
void hardware_rasterizer(
    hls::stream<raster_params_packet_fixed>& input_raster_params_stream,
    hls::stream<pixel_fragment_packet_fixed>& output_pixel_fragment_stream,
    const ap_uint<11> max_x_res, // 1280
    const ap_uint<11> max_y_res,  // 720
    const ap_uint<16> num_triangles,
    ap_uint<32>& total_fragments_generated // 输出参数，HR实际生成的所有像素片段总数
);

// 辅助函数声明
void process_pixels_for_triangle(
    const raster_params_packet_fixed& current_triangle_params,
    hls::stream<pixel_fragment_packet_fixed>& output_pixel_fragment_stream,
    fpal::fp_screen_pixel_idx_t min_x, fpal::fp_screen_pixel_idx_t max_x,
    fpal::fp_screen_pixel_idx_t min_y, fpal::fp_screen_pixel_idx_t max_y,
    fpal::fp_coord_t v0_x, fpal::fp_coord_t v0_y, fpal::fp_z_buffer_t v0_z_val,
    fpal::fp_coord_t dzdx, fpal::fp_coord_t dzdy,
    ap_uint<32>& fragment_counter // 用于计数
);

#endif // HR_HPP

